// 保存所有与用户相关的信息

// 导入操作 token 的方法
import { getToken, setToken, removeToken, setTime, removeTime } from '@/utils/auth.js'

// 导入登录的方法
import { loginApi, getInfoApi, getBaseApi } from '@/api/user.js'

export default {
  namespaced: true,
  state: {
    // token:
    token: getToken() || '',
    // 用户信息
    userInfo: {}
  },
  mutations: {
    // 保存 token 信息
    setToken(state, token) {
      // 保存在两个地方：
      //   浏览器本地
      setToken(token)
      //   vuex 中
      state.token = token
      // 顺便保存 token 的时间戳
      setTime()
    },
    // 删除 token
    removeToken(state) {
      // 删除两个地方的 token
      //    浏览器本地
      removeToken()
      //    vuex 中
      state.token = ''
    },
    // 保存用户信息
    setUserInfo(state, info) {
      state.userInfo = info
    },
    // 删除用户信息
    removeUserInfo(state) {
      state.userInfo = {}
    },
  },
  actions: {
    // 发送请求到服务器，获取 token
    async login({ commit }, form) {
      // 发送请求到服务器
      const res = await loginApi(form)
      // 接收返回的 token
      const token = res.data.data
      // 将 token 保存起来
      commit('setToken', token)
    },
    // 请求服务器得到用户信息
    async getUserInfo({ commit }) {
      // 得到用户基本资料
      const res = await getInfoApi()
      // 得到用户基本信息
      const baseRes = await getBaseApi(res.data.data.userId)
      // 将两个对象中的信息合并到一个对象中
      const userObj = { ...res.data.data, ...baseRes.data.data }
      // 保存用户信息
      commit('setUserInfo', userObj)
      // 这段代码在这里没有任何作用，只是为后面埋下伏笔
      return userObj
    },
    // 退出登录
    logout({ commit }) {
      // 清除 token
      commit('removeToken')
      // 清除用户信息
      commit('removeUserInfo')
      // 清除 token 时间
      removeTime()
    }
  },
  getters: {}
}